home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / mesa-1.2.8 / src-tk / getset.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  9KB  |  307 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "gltk.h"
  5. #include "private.h"
  6.  
  7.  
  8. /*
  9.  * Return the index of the first bit set.  I'm using this instead of the
  10.  * ffs() function because I'm not sure it's really portable.
  11.  */
  12. static int my_ffs( unsigned int n )
  13. {
  14.    if (n==0) {
  15.       return 0;
  16.    }
  17.    else {
  18.       unsigned int m = 1;
  19.       int index = 1;
  20.  
  21.       while ((n&m)==0) {
  22.      m <<= 1;
  23.      index++;
  24.       }
  25.       return index;
  26.    }
  27. }
  28.  
  29.  
  30. /******************************************************************************/
  31.  
  32. int tkGetColorMapSize(void)
  33. {
  34.  
  35.     if (!xDisplay) {
  36.     return 0;
  37.     } else {
  38.     return w.vInfoMain->colormap_size;
  39.     }
  40. }
  41.  
  42. /******************************************************************************/
  43.  
  44. void tkGetMouseLoc(int *x, int *y)
  45. {
  46.     int junk;
  47.  
  48.     *x = 0;
  49.     *y = 0;
  50.     XQueryPointer(xDisplay, w.wMain, (Window *)&junk, (Window *)&junk,
  51.           &junk, &junk, x, y, (unsigned int *)&junk);
  52. }
  53.  
  54. /******************************************************************************/
  55.  
  56. void tkGetSystem(TKenum type, void *ptr)
  57. {
  58.  
  59.     switch (type) {
  60.       case TK_X_DISPLAY:
  61.     *(Display **)ptr = xDisplay;
  62.     break;
  63.       case TK_X_WINDOW:
  64.     *(Window *)ptr = w.wMain;
  65.     break;
  66.     }
  67. }
  68.  
  69. /******************************************************************************/
  70.  
  71. void tkSetFogRamp(int density, int startIndex)
  72. {
  73.     XColor c[4096];
  74.     int rShift, gShift, bShift, intensity, fogValues, colorValues;
  75.     int i, j, k;
  76.  
  77.     switch (w.vInfoMain->class) {
  78.       case DirectColor:
  79.     fogValues = 1 << density;
  80.     colorValues = 1 << startIndex;
  81.     for (i = 0; i < colorValues; i++) {
  82.         for (j = 0; j < fogValues; j++) {
  83.         k = i * fogValues + j;
  84.         intensity = i * fogValues + j * colorValues;
  85.         if (intensity > w.vInfoMain->colormap_size) {
  86.             intensity = w.vInfoMain->colormap_size;
  87.         }
  88.         intensity = (intensity << 8) | intensity;
  89.         rShift = my_ffs((unsigned int)w.vInfoMain->red_mask) - 1;
  90.         gShift = my_ffs((unsigned int)w.vInfoMain->green_mask) - 1;
  91.         bShift = my_ffs((unsigned int)w.vInfoMain->blue_mask) - 1;
  92.         c[k].pixel = ((k << rShift) & w.vInfoMain->red_mask) |
  93.                  ((k << gShift) & w.vInfoMain->green_mask) |
  94.                  ((k << bShift) & w.vInfoMain->blue_mask);
  95.         c[k].red = (unsigned short)intensity;
  96.         c[k].green = (unsigned short)intensity;
  97.         c[k].blue = (unsigned short)intensity;
  98.         c[k].flags = DoRed | DoGreen | DoBlue;
  99.         }
  100.     }
  101.     XStoreColors(xDisplay, w.cMapMain, c, w.vInfoMain->colormap_size);
  102.     break;
  103.       case GrayScale:
  104.       case PseudoColor:
  105.     fogValues = 1 << density;
  106.     colorValues = 1 << startIndex;
  107.     for (i = 0; i < colorValues; i++) {
  108.         for (j = 0; j < fogValues; j++) {
  109.         k = i * fogValues + j;
  110.         intensity = i * fogValues + j * colorValues;
  111.         if (intensity > w.vInfoMain->colormap_size) {
  112.             intensity = w.vInfoMain->colormap_size;
  113.         }
  114.         intensity = (intensity << 8) | intensity;
  115.         c[k].pixel = k;
  116.         c[k].red = (unsigned short)intensity;
  117.         c[k].green = (unsigned short)intensity;
  118.         c[k].blue = (unsigned short)intensity;
  119.         c[k].flags = DoRed | DoGreen | DoBlue;
  120.         }
  121.     }
  122.     XStoreColors(xDisplay, w.cMapMain, c, w.vInfoMain->colormap_size);
  123.     break;
  124.     }
  125.  
  126.     XSync(xDisplay, 0);
  127. }
  128.  
  129. /******************************************************************************/
  130.  
  131. void tkSetGreyRamp(void)
  132. {
  133.     XColor c[4096];
  134.     float intensity;
  135.     int rShift, gShift, bShift, i;
  136.  
  137.     switch (w.vInfoMain->class) {
  138.       case DirectColor:
  139.     for (i = 0; i < w.vInfoMain->colormap_size; i++) {
  140.         intensity = (float)i / (float)w.vInfoMain->colormap_size *
  141.             65535.0 + 0.5;
  142.         rShift = my_ffs((unsigned int)w.vInfoMain->red_mask) - 1;
  143.         gShift = my_ffs((unsigned int)w.vInfoMain->green_mask) - 1;
  144.         bShift = my_ffs((unsigned int)w.vInfoMain->blue_mask) - 1;
  145.         c[i].pixel = ((i << rShift) & w.vInfoMain->red_mask) |
  146.              ((i << gShift) & w.vInfoMain->green_mask) |
  147.              ((i << bShift) & w.vInfoMain->blue_mask);
  148.         c[i].red = (unsigned short)intensity;
  149.         c[i].green = (unsigned short)intensity;
  150.         c[i].blue = (unsigned short)intensity;
  151.         c[i].flags = DoRed | DoGreen | DoBlue;
  152.     }
  153.     XStoreColors(xDisplay, w.cMapMain, c, w.vInfoMain->colormap_size);
  154.     break;
  155.       case GrayScale:
  156.       case PseudoColor:
  157.     for (i = 0; i < w.vInfoMain->colormap_size; i++) {
  158.         intensity = (float)i / (float)w.vInfoMain->colormap_size *
  159.             65535.0 + 0.5;
  160.         c[i].pixel = i;
  161.         c[i].red = (unsigned short)intensity;
  162.         c[i].green = (unsigned short)intensity;
  163.         c[i].blue = (unsigned short)intensity;
  164.         c[i].flags = DoRed | DoGreen | DoBlue;
  165.     }
  166.     XStoreColors(xDisplay, w.cMapMain, c, w.vInfoMain->colormap_size);
  167.     break;
  168.     }
  169.  
  170.     XSync(xDisplay, 0);
  171. }
  172.  
  173. /******************************************************************************/
  174.  
  175. void tkSetOneColor(int index, float r, float g, float b)
  176. {
  177.     XColor c;
  178.     int rShift, gShift, bShift;
  179.  
  180.     switch (w.vInfoMain->class) {
  181.       case DirectColor:
  182.     rShift = my_ffs((unsigned int)w.vInfoMain->red_mask) - 1;
  183.     gShift = my_ffs((unsigned int)w.vInfoMain->green_mask) - 1;
  184.     bShift = my_ffs((unsigned int)w.vInfoMain->blue_mask) - 1;
  185.     c.pixel = ((index << rShift) & w.vInfoMain->red_mask) |
  186.           ((index << gShift) & w.vInfoMain->green_mask) |
  187.           ((index << bShift) & w.vInfoMain->blue_mask);
  188.     c.red = (unsigned short)(r * 65535.0 + 0.5);
  189.     c.green = (unsigned short)(g * 65535.0 + 0.5);
  190.     c.blue = (unsigned short)(b * 65535.0 + 0.5);
  191.     c.flags = DoRed | DoGreen | DoBlue;
  192.     XStoreColor(xDisplay, w.cMapMain, &c);
  193.     break;
  194.       case GrayScale:
  195.       case PseudoColor:
  196.     if (index < w.vInfoMain->colormap_size) {
  197.         c.pixel = index;
  198.         c.red = (unsigned short)(r * 65535.0 + 0.5);
  199.         c.green = (unsigned short)(g * 65535.0 + 0.5);
  200.         c.blue = (unsigned short)(b * 65535.0 + 0.5);
  201.         c.flags = DoRed | DoGreen | DoBlue;
  202.         XStoreColor(xDisplay, w.cMapMain, &c);
  203.     }
  204.     break;
  205.     }
  206.  
  207.     XSync(xDisplay, 0);
  208. }
  209.  
  210. /******************************************************************************/
  211.  
  212. void tkSetOverlayMap(int size, float *rgb)
  213. {
  214.     XColor c;
  215.     unsigned long *buf;
  216.     int max, i;
  217.     Status status;
  218.  
  219.     if (w.vInfoOverlay->class == PseudoColor) {
  220.     max = (size > w.vInfoOverlay->colormap_size) ?
  221.           w.vInfoOverlay->colormap_size : size;
  222.     buf = (unsigned long *)calloc(max, sizeof(unsigned long));
  223.     status =
  224.             XAllocColorCells(xDisplay, w.cMapOverlay, True, NULL, 0, buf, max);
  225.         if (status )
  226.     for (i = /*1*/0; i < max; i++) {
  227.         c.pixel = buf[i];
  228.         c.red = (unsigned short)(rgb[i] * 65535.0 + 0.5);
  229.         c.green = (unsigned short)(rgb[size+i] * 65535.0 + 0.5);
  230.         c.blue = (unsigned short)(rgb[size*2+i] * 65535.0 + 0.5);
  231.         c.flags = DoRed | DoGreen | DoBlue;
  232.         XStoreColor(xDisplay, w.cMapOverlay, &c);
  233.     }
  234.     free(buf);
  235.     }
  236.  
  237.     XSync(xDisplay, 0);
  238. }
  239.  
  240. /******************************************************************************/
  241.  
  242. void tkSetRGBMap(int size, float *rgb)
  243. {
  244.     XColor c;
  245.     int rShift, gShift, bShift, max, i;
  246.  
  247.     switch (w.vInfoMain->class) {
  248.       case DirectColor:
  249.     max = (size > w.vInfoMain->colormap_size) ? w.vInfoMain->colormap_size
  250.                           : size;
  251.     rShift = my_ffs((unsigned int)w.vInfoMain->red_mask) - 1;
  252.     gShift = my_ffs((unsigned int)w.vInfoMain->green_mask) - 1;
  253.     bShift = my_ffs((unsigned int)w.vInfoMain->blue_mask) - 1;
  254.     c.flags = DoRed | DoGreen | DoBlue;
  255.     for (i = 0; i < max; i++) {
  256.         c.pixel = ((i << rShift) & w.vInfoMain->red_mask) |
  257.               ((i << gShift) & w.vInfoMain->green_mask) |
  258.               ((i << bShift) & w.vInfoMain->blue_mask);
  259.         c.red = c.green = c.blue = (unsigned short) (i * 65535 / (max-1));
  260.         XStoreColor(xDisplay, w.cMapMain, &c);
  261.     }
  262.     break;
  263.       case GrayScale:
  264.       case PseudoColor:
  265.     max = (size > w.vInfoMain->colormap_size) ? w.vInfoMain->colormap_size
  266.                           : size;
  267.     for (i = 0; i < max; i++) {
  268.         c.pixel = i;
  269.         c.red = (unsigned short)(rgb[i] * 65535.0 + 0.5);
  270.         c.green = (unsigned short)(rgb[size+i] * 65535.0 + 0.5);
  271.         c.blue = (unsigned short)(rgb[size*2+i] * 65535.0 + 0.5);
  272.         c.flags = DoRed | DoGreen | DoBlue;
  273.         XStoreColor(xDisplay, w.cMapMain, &c);
  274.     }
  275.     break;
  276.     }
  277.  
  278.     XSync(xDisplay, 0);
  279. }
  280.  
  281. /******************************************************************************/
  282.  
  283. GLenum tkSetWindowLevel(GLenum level)
  284. {
  285.  
  286.     switch (level) {
  287.       case TK_OVERLAY:
  288.     if (TK_HAS_OVERLAY(w.type)) {
  289.         if (!glXMakeCurrent(xDisplay, w.wOverlay, w.cOverlay)) {
  290.         return GL_FALSE;
  291.         }
  292.     } else {
  293.         return GL_FALSE;
  294.     }
  295.     break;
  296.       case TK_RGB:
  297.       case TK_INDEX:
  298.     if (!glXMakeCurrent(xDisplay, w.wMain, w.cMain)) {
  299.         return GL_FALSE;
  300.     }
  301.     break;
  302.     }
  303.     return GL_TRUE;
  304. }
  305.  
  306. /******************************************************************************/
  307.